#include "stdafx.h"
#pragma once
//-------------------------------------------------------------------------------------------------
//ImageObjectType.h  - Type of Object found in Image: (abstract base class)               
//-------------------------------------------------------------------------------------------------
//FreeBSD License
//Copyright 2011 Will Stott All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are
//permitted provided that the following conditions are met:
//
//   1. Redistributions of source code must retain the above copyright notice, this list of
//      conditions and the following disclaimer.
//
//   2. Redistributions in binary form must reproduce the above copyright notice, this list
//      of conditions and the following disclaimer in the documentation and/or other materials
//      provided with the distribution.
//
//THIS SOFTWARE IS PROVIDED BY Will Stott ``AS IS'' AND ANY EXPRESS OR IMPLIED
//WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Will Stott OR
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
//ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
//ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//The views and conclusions contained in the software and documentation are those of the
//authors and should not be interpreted as representing official policies, either expressed
//or implied, of Will Stott.
//
//----Authors--------------------------------------------------------------------------------------
//created by: will.stott@ucl.ac.uk July 2011
//
//----Comments-------------------------------------------------------------------------------------
//
// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the IMAGEPROCLIB_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// IMAGEPROCLIBAPI functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
//--------------------------------------------------------------------------------------------------

#ifdef IMAGEPROCLIB_EXPORTS
#define IMAGEPROCLIBAPI __declspec(dllexport)
#else
#define IMAGEPROCLIBAPI __declspec(dllimport)
#endif

#include <vector>
#include "TinyXmlLib.h"
#include "ResourceList.h"
#include "ImageTypeProp.h"

class IMAGEPROCLIBAPI ImageObjectType
{
public:
	static const char * const attribClassName;
	static const char * const defaultPenColour;

	static const int NAME_LEN = 24;
	static const int CODE_LEN = 3;
	static const int PEN_COLOUR_LEN = 11;
	static const int MENUNAME_LEN = 15;
private:
	//#pragma warning(disable:4251)
	std::vector<ImageTypeProp *>   _ImageTypeProps;						//properties that a user should specify for images of this type
	//#pragma warning(default:4251)

protected:
	char _Name[NAME_LEN+1];
	char _Code[CODE_LEN+1];
	char _PenColour[PEN_COLOUR_LEN+1];
	unsigned long _PenCOLORREF;
	unsigned long _InvPenCOLORREF;
	char _MenuName[MENUNAME_LEN+1];
	int	 _Emax;
	int	 _ResourceId;

public:
	ImageObjectType(void);
	virtual ~ImageObjectType(void);

	static ImageObjectType *CreateImageObjectType(TiXmlElement *xmlImageObjectType, ResourceList &resourceList);

	int				 GetPropertyCnt() { return _ImageTypeProps.size(); }
	ImageTypeProp   *GetProperty( size_t index) { return  _ImageTypeProps[index]; }
	ImageTypeProp   *LookupProperty (const char *name);

	virtual void SetName( const char *name) { strncpy(_Name, name, NAME_LEN ), _Name[NAME_LEN] = '\0'; }
	virtual void SetCode( const char *code) { strncpy(_Code, code, CODE_LEN ), _Code[CODE_LEN] = '\0'; }
	virtual void SetPenColour( const char *colour); 
	virtual void SetMenuName( const char *tool) { strncpy(_MenuName, tool, MENUNAME_LEN ), _MenuName[MENUNAME_LEN] = '\0'; }
	virtual void SetExpertMaxObjs(const int cnt) { _Emax = cnt; }


	virtual const char *GetName() { return _Name; }
	virtual const char *GetCode() { return _Code; }
	virtual unsigned long GetPenColour() { return _PenCOLORREF; }
	virtual unsigned long GetInversePenColour() { return _InvPenCOLORREF; }
	virtual const char *GetPenColourStr() { return _PenColour; }
	virtual const char *GetMenuName() { return _MenuName; }
	virtual int  GetExpertMaxObjs() { return _Emax; }


	virtual const char *GetBaseClassName() = 0;
	virtual int			GetResourceId() { return _ResourceId; }

private:
	void			AddProperties (TiXmlElement *xmlImageTypeImageObjects );
	bool			AddProperty (ImageTypeProp *pImageTypeProp );
	static TiXmlElement *	FindImageTypeImageObjectProperties  (TiXmlElement *pImageTypeImageObjectXml);
	bool			ClearAllLists();

};


//-------------------------------------------------------------------------------------------------
//			E N D   O F   F I L E
//-------------------------------------------------------------------------------------------------

